#一个方法里面可以执行增删改查
import os.path

import pymysql
import xlrd


def db_util(sql: str, host='localhost', port=3306, user='root', password='', database=''):
    """
    通用数据库操作函数，支持增删改查操作
    Args:
        sql: SQL语句
        host: 数据库主机地址
        port: 数据库端口
        user: 用户名
        password: 密码
        database: 数据库名
    Returns:       查询结果列表（仅SELECT语句返回）
    
    Raises:
        Exception: SQL执行异常时回滚并抛出异常
    """
    with pymysql.connect(host=host, port=port, user=user, password=password, database=database) as db:
        with db.cursor() as cursor:
            try:
                # 判断SQL类型
                sql_stripped = sql.strip().lower()
                if sql_stripped.startswith('select'):
                    cursor.execute(sql)
                    result = cursor.fetchall()
                    return result
                else:
                    # 处理INSERT/UPDATE/DELETE等操作
                    cursor.execute(sql)
                    db.commit()
                    # 返回受影响的行数
                    return cursor.rowcount
            except Exception as e:
                # 发生异常时回滚事务
                db.rollback()  # 回滚事务
                raise e  # 抛出异常


def read_excel(file_name: str, sheet_name: str, row_index:int=0) -> list[tuple]:
    """
    读取Excel文件指定工作表的数据
    
    Args:
        file_name: Excel文件路径
        sheet_name: 工作表名称
        row_index: 开始读取的行索引
        
    Returns:
        list: 包含每行数据的元组列表
    """

    try:
        file_name = file_name.lstrip("../").lstrip("./")  # 处理相对路径
        bath_path = os.path.dirname(os.path.dirname(__file__))  # 获取项目根目录
        file_path = os.path.normpath(os.path.join(bath_path, file_name))  # 拼接文件路径
        wb = xlrd.open_workbook(file_path)
        sheet = wb.sheet_by_name(sheet_name)
        # 使用列表推导式读取从row_index开始的所有行数据
        return [tuple(sheet.row_values(x)) for x in range(row_index, sheet.nrows)]
    except Exception as e:
        raise Exception(f"读取Excel文件失败: {str(e)}")


if __name__ == '__main__':
    file_name = "../data/test_data.xls"
    # file_name=os.path.normpath(file_name)
    # print(file_name)
    file_name =file_name.lstrip("../").lstrip("./")

    bath_path = os.path.dirname(os.path.dirname(__file__))
    # #
    file_path = os.path.join(bath_path, file_name)  # 拼接文件路径
    print(file_path)
    # #
    # # # 规范路径,处理 ..和 .符号
    # file_path = os.path.normpath(file_path)
    # print(file_path)


    # print(read_excel("../data/test_data.xls", "login_data", 1))
